package cineplanet.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import javax.sql.DataSource;

import cineplanet.excepcion.DAOExcepcion;
import cineplanet.modelo.ProductoTipo;

public class ProductoTipoDAOImpl extends BaseDAO implements ProductoTipoDAO {
	private DataSource dataSource;

	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	@Override
	public ProductoTipo insertar(ProductoTipo vo) throws DAOExcepcion {
		String query = "INSERT INTO productotipo(tipo,estado) VALUES (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getTipo());
			stmt.setByte(2, vo.getEstado());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			} // Obtener el ultimo id
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdProductoTipo(rs.getInt(1));
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	@Override
	public ProductoTipo actualizar(ProductoTipo vo) throws DAOExcepcion {
		// Actualizar los campos para la actualizacion
		String query = "update productotipo set tipo=?,estado=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getTipo());
			stmt.setByte(2, vo.getEstado());

			int i = stmt.executeUpdate();
			if (i != 1) {
				vo = null;
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	@Override
	public void eliminar(int idProductoTipo) throws DAOExcepcion {
		String query = "DELETE FROM productotipo WHERE idProductoTipo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idProductoTipo);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	@Override
	public ProductoTipo obtener(int idProductoTipo) throws DAOExcepcion {
		ProductoTipo vo = new ProductoTipo();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idProductoTipo, tipo, estado from Productotipo where idProductoTipo=?";
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idProductoTipo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdProductoTipo(rs.getInt("idProductoTipo"));
				vo.setTipo(rs.getString("tipo"));
				vo.setEstado(rs.getByte("estado"));

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
		}
		return vo;
	}

	@Override
	public Collection<ProductoTipo> listar() throws DAOExcepcion {
		Collection<ProductoTipo> c = new ArrayList<ProductoTipo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			// Actualizar el query para la DB
			String query = "SELECT * from productotipo";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ProductoTipo vo = new ProductoTipo();
				vo.setIdProductoTipo(rs.getInt("idProductoTipo"));
				vo.setTipo(rs.getString("tipo"));
				vo.setEstado(rs.getByte("estado"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}
